package _1_单调栈

/*
*
原题链接:
https://leetcode.cn/problems/next-greater-element-i/

496. 下一个更大元素 I
nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。
给你两个 没有重复元素 的数组 nums1 和 nums2 ，下标从 0 开始计数，其中nums1 是 nums2 的子集。
对于每个 0 <= i < nums1.length ，找出满足 nums1[i] == nums2[j] 的下标 j ，并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素，那么本次查询的答案是 -1 。
返回一个长度为 nums1.length 的数组 ans 作为答案，满足 ans[i] 是如上所述的 下一个更大元素 。

示例 1：
输入：nums1 = [4,1,2], nums2 = [1,3,4,2].
输出：[-1,3,-1]
解释：nums1 中每个值的下一个更大元素如下所述：
- 4 ，用加粗斜体标识，nums2 = [1,3,4,2]。不存在下一个更大元素，所以答案是 -1 。
- 1 ，用加粗斜体标识，nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ，用加粗斜体标识，nums2 = [1,3,4,2]。不存在下一个更大元素，所以答案是 -1 。

示例 2：
输入：nums1 = [2,4], nums2 = [1,2,3,4].
输出：[3,-1]
解释：nums1 中每个值的下一个更大元素如下所述：
- 2 ，用加粗斜体标识，nums2 = [1,2,3,4]。下一个更大元素是 3 。
- 4 ，用加粗斜体标识，nums2 = [1,2,3,4]。不存在下一个更大元素，所以答案是 -1 。
*/
func nextGreaterElement(nums1 []int, nums2 []int) []int {
	res := make([]int, len(nums1)) //声明结果数组, 每个位置都初始化为-1
	for i := range res {
		res[i] = -1
	}

	mp := map[int]int{}       //声明map
	for i, v := range nums1 { //遍历nums1, 将值作为key, 下标作为value
		mp[v] = i
	}

	var stack []int          // 单调栈
	stack = append(stack, 0) //添加0下标

	for i := 1; i < len(nums2); i++ { //从1下标开始遍历nums2
		for len(stack) > 0 && nums2[i] > nums2[stack[len(stack)-1]] { //如果栈不为空 && 当前nums2元素 > 栈口元素
			top := stack[len(stack)-1] //获取栈顶元素

			if _, ok := mp[nums2[top]]; ok { // 看map里是否存在这个元素
				index := mp[nums2[top]] // 根据map找到nums2[top] 在 nums1中的下标
				res[index] = nums2[i]
			}

			stack = stack[:len(stack)-1] // 出栈
		}
		stack = append(stack, i)
	}
	return res
}
